Polymorphic Mapping হল MapStruct এর একটি বৈশিষ্ট্য যা আপনাকে বিভিন্ন ক্লাসের অবজেক্টগুলির মধ্যে ম্যাপিং করতে সহায়তা করে, যখন তারা একই বেস ক্লাস বা ইন্টারফেস থেকে উৎসাহিত হয়। এটি সাধারণত এমন পরিস্থিতিতে ব্যবহৃত হয় যেখানে আপনি একাধিক সাব ক্লাস বা ইন্টারফেসের মধ্যে ডেটা ট্রান্সফার করতে চান, কিন্তু আপনি বেস ক্লাস বা ইন্টারফেসের সাধারণ ফাংশনালিটি ব্যবহার করতে চান।
MapStruct এর মাধ্যমে polymorphic mapping করতে হলে, আপনাকে সঠিকভাবে @Mapping অ্যানোটেশন ব্যবহার করতে হবে এবং Inheritance বা Interfaces এর মাধ্যমে ম্যাপিং সম্পন্ন করতে হবে।
১. Polymorphic Mapping এর ধারণা
Polymorphic Mapping এমন একটি প্রক্রিয়া যেখানে আপনি একটি base class বা interface এবং তার subclasses বা implementations এর মধ্যে ম্যাপিং করেন। যদি আপনি একটি List বা Set থেকে ডেটা ম্যাপ করতে চান এবং তার মধ্যে বিভিন্ন ধরনের অবজেক্ট থাকে (যেমন একটি বেস ক্লাসের বিভিন্ন সাবক্লাস), তাহলে Polymorphic Mapping ব্যবহৃত হয়।
উদাহরণ:
ধরা যাক, আমাদের একটি বেস ক্লাস Employee রয়েছে এবং তার দুটি সাব ক্লাস Manager এবং Developer রয়েছে। আমাদের উদ্দেশ্য হলো, Employee এর একটি সাব ক্লাসকে অন্য এক ডেটা ট্রান্সফার অবজেক্টে (DTO) ম্যাপ করা।
২. Polymorphic Mapping এর জন্য ডোমেইন ক্লাস তৈরি করা
Employee.java (Base class):
public class Employee {
private String name;
private int age;
// Getters and Setters
}
Manager.java (Sub class):
public class Manager extends Employee {
private String department;
// Getters and Setters
}
Developer.java (Sub class):
public class Developer extends Employee {
private String programmingLanguage;
// Getters and Setters
}
এখানে, Employee হল বেস ক্লাস এবং Manager ও Developer হল সাব ক্লাস।
৩. DTO ক্লাস তৈরি করা
এখন আমরা EmployeeDTO, ManagerDTO, এবং DeveloperDTO তৈরি করব, যা আমাদের ট্রান্সফার অবজেক্ট (DTO) হবে।
EmployeeDTO.java (DTO):
public class EmployeeDTO {
private String name;
private int age;
// Getters and Setters
}
ManagerDTO.java (DTO):
public class ManagerDTO extends EmployeeDTO {
private String department;
// Getters and Setters
}
DeveloperDTO.java (DTO):
public class DeveloperDTO extends EmployeeDTO {
private String programmingLanguage;
// Getters and Setters
}
এখানে, ManagerDTO এবং DeveloperDTO EmployeeDTO থেকে এক্সটেন্ড করা হয়েছে।
৪. MapStruct Mapper Interface
এখন, আমরা MapStruct Mapper ইন্টারফেস তৈরি করব, যা বেস ক্লাস এবং তার সাব ক্লাসের মধ্যে ম্যাপিং করবে।
EmployeeMapper.java:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface EmployeeMapper {
EmployeeMapper INSTANCE = Mappers.getMapper(EmployeeMapper.class);
// Polymorphic Mapping
EmployeeDTO employeeToEmployeeDTO(Employee employee);
ManagerDTO managerToManagerDTO(Manager manager);
DeveloperDTO developerToDeveloperDTO(Developer developer);
}
এখানে:
employeeToEmployeeDTOমেথডটি Employee এর সমস্ত সাব ক্লাসের জন্য কাজ করবে।managerToManagerDTOএবংdeveloperToDeveloperDTOমেথড দুটি নির্দিষ্ট ক্লাসের জন্য ম্যাপিং করবে।
৫. Polymorphic Mapping এর ব্যবহারের উদাহরণ
এখন আমরা EmployeeMapper ইন্টারফেস ব্যবহার করে polymorphic mapping করব। এই উদাহরণে, আমরা Employee, Manager, এবং Developer এর মধ্যে ডেটা ট্রান্সফার করব।
Main.java (Usage):
public class Main {
public static void main(String[] args) {
// Creating Manager object
Manager manager = new Manager();
manager.setName("John Doe");
manager.setAge(45);
manager.setDepartment("Engineering");
// Creating Developer object
Developer developer = new Developer();
developer.setName("Jane Smith");
developer.setAge(30);
developer.setProgrammingLanguage("Java");
// Polymorphic Mapping
EmployeeDTO managerDTO = EmployeeMapper.INSTANCE.employeeToEmployeeDTO(manager);
EmployeeDTO developerDTO = EmployeeMapper.INSTANCE.employeeToEmployeeDTO(developer);
System.out.println("Manager DTO: " + managerDTO.getName() + ", " + managerDTO.getAge());
System.out.println("Developer DTO: " + developerDTO.getName() + ", " + developerDTO.getAge());
}
}
এখানে, employeeToEmployeeDTO মেথডটি Manager এবং Developer উভয়ের ক্ষেত্রেই কাজ করবে, কারণ এটি polymorphic mapping-এর জন্য প্রস্তুত।
৬. Polymorphic Mapping এর ফলাফল
এই কোড চালানোর পর, EmployeeMapper এর মাধ্যমে Manager এবং Developer অবজেক্টগুলির EmployeeDTO তে ম্যাপিং হবে এবং তাদের তথ্য আউটপুট হবে।
আউটপুট:
Manager DTO: John Doe, 45
Developer DTO: Jane Smith, 30
এখানে, EmployeeMapper বেস ক্লাস Employee এবং তার সাব ক্লাস Manager এবং Developer এর মধ্যে polymorphic ম্যাপিং সম্পন্ন করেছে।
৭. Polymorphic Mapping এর সুবিধা
- Reuse: একটি base class বা interface এর মাধ্যমে ডেটা ট্রান্সফার অবজেক্ট (DTO) এর মধ্যে ম্যাপিং করার ফলে কোড পুনরায় ব্যবহারযোগ্য হয়।
- Simplified Code: একাধিক সাব ক্লাসের জন্য পৃথক ম্যাপিং মেথড না লিখে, polymorphic mapping ব্যবহারের মাধ্যমে আপনি কোডের সংখ্যা কমাতে পারেন।
- Maintainability: যখন নতুন সাব ক্লাস যোগ করা হয়, তখন আপনাকে শুধুমাত্র একটি সাধারণ ম্যাপিং মেথডেই পরিবর্তন করতে হবে, যা সহজে রক্ষণাবেক্ষণযোগ্য।
সারাংশ
Polymorphic Mapping MapStruct এর একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে একাধিক সাব ক্লাসের মধ্যে ডেটা ট্রান্সফার করতে সহায়তা করে। এই কৌশলের মাধ্যমে, আপনি base class বা interface ব্যবহার করে subclasses এর মধ্যে ম্যাপিং কার্যক্রম সম্পন্ন করতে পারেন। এতে কোডের পুনঃব্যবহারযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা বৃদ্ধি পায়, এবং একাধিক ম্যাপিং মেথড লেখার প্রয়োজনীয়তা কমে।